package scheduler

import "MyWebcrawler/module"

type Args interface {
	// 若结果值为nil，则说明未发现问题，否则就意味着自检未通过。
	Check() error
}

type RequestArgs struct {
	AcceptedDomains []string `json:"accepted_primary_domains"`
	MaxDepth        uint32   `json:"max_depth"`
}

func (args *RequestArgs) Check() error {
	if args.AcceptedDomains == nil {
		return genChedulerError("nil accepted primary domain list")
	}
	return nil
}

func (args *RequestArgs) Same(another *RequestArgs) bool {
	if another == nil {
		return false
	}
	if another.MaxDepth != args.MaxDepth {
		return false
	}
	anotherDomains := another.AcceptedDomains
	anotherDomainsLen := len(anotherDomains)
	if anotherDomainsLen != len(args.AcceptedDomains) {
		return false
	}
	if anotherDomainsLen > 0 {
		for i, domain := range anotherDomains {
			if domain != args.AcceptedDomains[i] {
				return false
			}
		}
	}
	return true
}

// DataArgs 代表数据相关的参数容器的类型。
type DataArgs struct {
	// ReqBufferCap 代表请求缓冲器的容量。
	ReqBufferCap uint32 `json:"req_buffer_cap"`
	// ReqMaxBufferNumber 代表请求缓冲器的最大数量。
	ReqMaxBufferNumber uint32 `json:"req_max_buffer_number"`
	// RespBufferCap 代表响应缓冲器的容量。
	RespBufferCap uint32 `json:"resp_buffer_cap"`
	// RespMaxBufferNumber 代表响应缓冲器的最大数量。
	RespMaxBufferNumber uint32 `json:"resp_max_buffer_number"`
	// ItemBufferCap 代表条目缓冲器的容量。
	ItemBufferCap uint32 `json:"item_buffer_cap"`
	// ItemMaxBufferNumber 代表条目缓冲器的最大数量。
	ItemMaxBufferNumber uint32 `json:"item_max_buffer_number"`
	// ErrorBufferCap 代表错误缓冲器的容量。
	ErrorBufferCap uint32 `json:"error_buffer_cap"`
	// ErrorMaxBufferNumber 代表错误缓冲器的最大数量。
	ErrorMaxBufferNumber uint32 `json:"error_max_buffer_number"`
}

func (args *DataArgs) Check() error {
	if args.ReqBufferCap == 0 {
		return genChedulerError("zero request buffer capacity")
	}
	if args.ReqMaxBufferNumber == 0 {
		return genChedulerError("zero max request buffer number")
	}
	if args.RespBufferCap == 0 {
		return genChedulerError("zero response buffer capacity")
	}
	if args.RespMaxBufferNumber == 0 {
		return genChedulerError("zero max response buffer number")
	}
	if args.ItemBufferCap == 0 {
		return genChedulerError("zero item buffer capacity")
	}
	if args.ItemMaxBufferNumber == 0 {
		return genChedulerError("zero max item buffer number")
	}
	if args.ErrorBufferCap == 0 {
		return genChedulerError("zero error buffer capacity")
	}
	if args.ErrorMaxBufferNumber == 0 {
		return genChedulerError("zero max error buffer number")
	}
	return nil
}

// ModuleArgs 代表组件相关的参数容器的类型。
type ModuleArgs struct {
	Downloaders []module.Downloader
	Analyzers   []module.Analyzer
	Pipelines   []module.Pipeline
}

func (args *ModuleArgs) Check() error {
	if len(args.Downloaders) == 0 {
		return genChedulerError("empty downloader list")
	}
	if len(args.Analyzers) == 0 {
		return genChedulerError("empty analyzer list")
	}
	if len(args.Pipelines) == 0 {
		return genChedulerError("empty pipeline list")
	}
	return nil
}
